class Watcher {
  /**
   *Creates an instance of Watcher.
   * @param {Vue} vm vue 实例
   * @param {String} key data 中的属性名
   * @param {Function} cb 负责更新视图的方法
   * @memberof Watcher
   */
  constructor (vm, key, cb) {
    this.vm = vm
    this.key = key
    this.cb = cb
    // 把 watcher 对象记录到 Dep 类的静态属性 target
    Dep.target = this

    // 此处访问了 vm[key] 触发了它的 get 在 get 方法中会调用 addSub
    this.oldValue = vm[key]
    
    Dep.target = null
  }
  /**
   * 当数据发生变化的时候更新视图
   *
   * @memberof Watcher
   */
  update() {
    let newValue = this.vm[this.key]
    if(this.oldValue === newValue) {
      return
    }
    this.cb(newValue)
  }
}